package com.swiftride.template;

import com.swiftride.properties.RedisGeoProperties;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.List;

public class RedisGeoTemplate {

    private final RedisGeoProperties redisGeoProperties;

    public RedisGeoTemplate(RedisGeoProperties redisGeoProperties) {
        this.redisGeoProperties = redisGeoProperties;
    }


    /**
     * 根据Geo空间 , 中心点位置 查询圆形区域的数据
     *
     * @param redisTemplate redisTemplate
     * @param key           Geo空间
     * @param point         中心点位置
     * @return 圆形区域的数据
     */
    public List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> geoRadius(RedisTemplate<String, Object> redisTemplate, String key, Point point) {
        // 创建一个距离对象
        Distance distance = new Distance(redisGeoProperties.getSearchRadius(), RedisGeoCommands.DistanceUnit.KILOMETERS);
        // 创建一个圆形区域
        Circle circle = new Circle(point, distance);
        // 创建一个geoRadius命令参数对象
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs
                .newGeoRadiusArgs() // 创建geoRadius命令参数对象
                .includeDistance() // 包含距离
                .includeCoordinates() // 包含坐标
                .sortAscending() // 按距离由近及远排序
                .limit(redisGeoProperties.getLimit()); // 限制返回结果为10个
        GeoResults<RedisGeoCommands.GeoLocation<Object>> locationGeoResults = redisTemplate.opsForGeo().radius(key, circle, args);
        return locationGeoResults == null ? null : locationGeoResults.getContent();
    }
}
